package main

import (
	"fmt"
	"user/common"
	"user/domain/repository"
	"user/domain/service"
	"user/handler"
	"user/proto/user"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"github.com/micro/go-micro/v2"
	log "github.com/micro/go-micro/v2/logger"
	"github.com/micro/go-micro/v2/registry"
	"github.com/micro/go-plugins/registry/consul/v2"
)

func main() {
	// 配置中心
	consulConfig, err := common.GetConsulConfig("127.0.0.1", 8500, "/micro/config")
	if err != nil {
		log.Error(err)
	}
	// 注册中心
	consulRegistry := consul.NewRegistry(func(o *registry.Options) {
		o.Addrs = []string{
			"127.0.0.1:8500",
		}
	})
	// Create service
	srv := micro.NewService(
		micro.Name("go.micro.service.user"),
		micro.Version("latest"),
		// 这里设置地址和需要暴露的端口
		micro.Address("127.0.0.1:8081"),
		// 添加consul为注册中心
		micro.Registry(consulRegistry),
	)
	// 获取mysql的配置
	mysqlInfo := common.GetMysqlFromConsul(consulConfig, "mysql")

	// 链接mysql
	db, err := gorm.Open("mysql", mysqlInfo.User+":"+mysqlInfo.Pwd+"@/"+mysqlInfo.DataBase+"?charset=utf8&parseTime=True&loc=Local")

	if err != nil {
		log.Error(err)
	}
	defer db.Close()
	// 禁止创建表名复数
	db.SingularTable(true)

	// 创建表 只能运行一次要不以后会报错
	// rp := repository.NewUserRepository(db)
	// rp.InitTable()
	// 初始化服务
	srv.Init()

	// 创建服务实例
	userDataService := service.NewUserDataService(repository.NewUserRepository(db))
	// 注册Handler
	err = user.RegisterUserHandler(srv.Server(), &handler.User{UserDataService: userDataService})
	if err != nil {
		fmt.Println(err)
	}
	// Run service
	if err = srv.Run(); err != nil {
		fmt.Println(err)
	}
}
